package org.zch.dao;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.zch.entity.dto.BottomDTO;
import org.zch.entity.dto.WorksDTO;
import org.zch.entity.dto.WorksUserDTO;
import org.zch.entity.po.WorksPO;
import org.zch.entity.vo.WorksVO;

import java.util.List;
import java.util.Map;

/**
 * 作品表(Works)表数据库访问层
 *
 * @author 刘新
 * @since 2024-01-03 14:09:06
 */
@Mapper
public interface WorksDAO extends BaseMapper<WorksPO> {

    /**
     * 批量新增数据（MyBatis原生foreach方法）
     *
     * @param list List<Works> 实例对象列表
     * @return 影响行数
     */
    int insertBatch(@Param("list") List<WorksPO> list);

    /**
     * 批量新增或按主键更新数据（MyBatis原生foreach方法）
     *
     * @param list List<Works> 实例对象列表
     * @return 影响行数
     * @throws org.springframework.jdbc.BadSqlGrammarException 入参是空List的时候会抛SQL语句错误的异常，请自行校验入参
     */
    int insertOrUpdateBatch(@Param("list") List<WorksPO> list);


    /**
     * 获取作品分数最大值、最小值、平均值
     * @return
     */
    @SuppressWarnings("MybatisXMapperMethodInspection")
    Map<String, Double> getScore();

    /**
     * 获取作品列表
     * @param userId 用户id
     * @param upper  上限
     * @param lower  下限
     * @param looked 是否看过
     * @param size   条数
     * @return
     */
    List<WorksVO> getWorks(@Param("userId") Integer userId,
                           @Param("upper") double upper,
                           @Param("lower") double lower,
                           @Param("looked") Integer looked,
                           @Param("size") int size);

    /**
     * 获取最新作品
     *
     * @param page
     * @return
     */
    IPage<WorksVO> newList(Page<WorksPO> page);

    /**
     * 发现列表
     *
     * @param page
     * @return
     */
    IPage<WorksVO> foundList(Page<WorksPO> page);


    /**
     * 待审核列表
     *
     * @param page
     * @return
     */
    IPage<WorksPO> waitList(Page<WorksPO> page);


    /**
     * 根据code获取作品数量
     *
     * @param userCode 用户编码
     * @param status   0待审核、1已通过、2已拒绝
     * @return
     */
    Integer getWorksQuantityByUserCode(@Param("userCode") String userCode, @Param("status") Integer status);

    /**
     * 根据code、状态获取用户作品
     *
     * @param page 查询对象
     * @return 返回结果
     */
    IPage<WorksVO> getWorksByUserCode(WorksUserDTO page);

    /**
     * 增加浏览量（浏览量+1）
     * @param list 作品id集合
     * @return
     */
    int addPlayCount(@Param("list") List<Integer> list);

    /**
     * 增加点赞量（点赞量+1）
     * @param list
     * @return
     */
    int addLikedCount(@Param("list") List<Integer> list);

    /**
     * 减少点赞量（点赞量-1）
     * @param list
     * @return
     */
    int reduceLikedCount(@Param("list") List<Integer> list);


    /**
     * 增加语音播放量（语音播放量+1）
     * @param list
     * @return
     */
    int addVoiceCount(@Param("list") List<Integer> list);

    /**
     * 垫底数据
     *
     * @param dto 查询的条数
     * @return 返回数据
     */
    List<WorksVO> bottomList(BottomDTO dto);

    /**
     * 推荐垫底数据列表
     */
    IPage<WorksVO> recommendEmList(Page<WorksPO> page);

    /**
     * 被赞数量
     * @param code 用户code
     * @return
     */
    Integer beenLikedNum(@Param("code") String code);

    Integer beenVoiceNum(@Param("code") String code);

    List<WorksPO> oldWorks();
}

